package main

import (
	"NewEdu/models"
	"NewEdu/routers"
	"NewEdu/utils"
	"log"
	"time"

	"github.com/beego/beego/v2/client/orm"
	beego "github.com/beego/beego/v2/server/web"
	_ "github.com/go-sql-driver/mysql"
)

func init() {
	// 1. 初始化配置
	if err := utils.InitConfig(); err != nil {
		log.Fatalf("配置初始化失败: %v", err)
	}
	beego.BConfig.CopyRequestBody = true
}
func main() {

	// 2. 初始化日志系统
	if err := utils.InitLogger(); err != nil {
		log.Fatalf("日志系统初始化失败: %v", err)
	}

	utils.Info("应用程序启动中...", map[string]interface{}{
		"version": "1.0.0",
		"mode":    beego.BConfig.RunMode,
	})

	// 3. 初始化数据库连接
	sqlConn, err := beego.AppConfig.String("sqlconn")
	if err != nil {
		utils.Fatal("获取数据库配置失败", map[string]interface{}{"error": err.Error()})
	}

	orm.RegisterDataBase("default", "mysql", sqlConn)
	utils.Info("数据库连接成功：" + sqlConn)

	// 4. 开发模式配置
	if beego.BConfig.RunMode == "dev" {
		beego.BConfig.WebConfig.DirectoryIndex = true
		beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
		orm.Debug = true
		utils.Info("开发模式已启用")
	}

	// 5. 初始化Redis
	if err := utils.InitRedis(); err != nil {
		utils.Fatal("Redis初始化失败", map[string]interface{}{"error": err.Error()})
	}

	// 6. 开启后台数据同步任务
	go startBackgroundTasks()

	// 7. 设置静态文件目录
	beego.SetStaticPath("/upload", utils.AppConfig.UploadDir)

	// 8. 初始化路由
	routers.InitRouter()

	utils.Info("应用程序已准备就绪", map[string]interface{}{
		"port":       beego.BConfig.Listen.HTTPPort,
		"upload_dir": utils.AppConfig.UploadDir,
	})

	// 9. 启动服务器
	beego.Run()
}

// startBackgroundTasks 启动后台任务
func startBackgroundTasks() {
	utils.Info("后台任务已启动")

	// 立即执行一次数据同步
	go func() {
		utils.Info("开始初始数据同步...")
		if err := models.LoadDepart2Redis(); err != nil {
			utils.Error("部门数据同步失败", map[string]interface{}{"error": err.Error()})
		}
		if err := models.LoadUser2Redis(); err != nil {
			utils.Error("用户数据同步失败", map[string]interface{}{"error": err.Error()})
		}
		if err := models.LoadTemplate2Redis(); err != nil {
			utils.Error("模板数据同步失败", map[string]interface{}{"error": err.Error()})
		}
		utils.Info("初始数据同步完成")
	}()

	// 定时同步任务
	for {
		time.Sleep(5 * time.Minute) // 从1分钟改为5分钟，减少频繁同步

		utils.Debug("开始定时数据同步...")

		if err := models.LoadDepart2Redis(); err != nil {
			utils.Error("定时部门数据同步失败", map[string]interface{}{"error": err.Error()})
		}

		if err := models.LoadUser2Redis(); err != nil {
			utils.Error("定时用户数据同步失败", map[string]interface{}{"error": err.Error()})
		}

		if err := models.LoadTemplate2Redis(); err != nil {
			utils.Error("定时模板数据同步失败", map[string]interface{}{"error": err.Error()})
		}

		utils.Debug("定时数据同步完成")
	}
}
